ClojureScript (Squint) で React フロントエンド開発 2025 年版
https://fortee.jp/2025fp-matsuri/proposal/e7f30174-d4b9-40a7-9398-9f15c71009a9
https://speakerdeck.com/kbaba1001/build-react-system-with-clojurescript-squint
https://www.kbaba1001.com/posts/202410130849_opening-up-new-possibilities-for-clojure-script-with-squint/
ClojureScript のビルドの歴史
npm で使えるようになったのは最近
それまでは Clojure のビルドシステムに乗っかってきた
Maven / Gradle → Leiningen / Boot → Clojure CLI など
パッケージシステムである Clojars には cljsjs という名前空間で登録していた
デメリット
npm が成熟していくと、相対的に不便になってきた
Hot reload ができないため REPL からリロードする必要があった
Figwheel
Hot reload が可能
cljsjs を扱える
頑張れば npm パッケージも使えるらしい?
shadow-cljs
現時点での デファクトスタンダード
npm からインストールできるようになった
npm ライブラリも clojars のライブラリも使える
Hot reload も可能
webpack や vite のような感じで使える
デメリット
起動がちょっと遅い
CSS のビルドができない
UserGuide をしっかり読む必要がある
確かにキャッチアップする時にめちゃくちゃこのページ見た気がする radish-miyazaki.icon
ClojureScript 自体への不満
Maps や Vectors は JavaScript の Objects や Arrays ではないので変換が必要
async / await をサポートしていないため Promise を処理する際に困る
core.async を使うとほとんど同じことはできる
が、Promise を返すわけではないので組み合わせた時にうまく動作しない
Squint
既存の ClojureScript との互換性を捨てて、JavaScript の親和性を高めた ClojureScript の 方言
Maps や Vector などが JavaScript の普通のオブジェクトや Array に変換される
ビルド語のファイルサイズが小さい
JSX / HTML をサポート
async / await が使える
Vite
warning.icon
仕様が固まっていないので、本番環境での使用は注意が必要
細かい不具合はまだ多い
既存の ClojureScript の資産が使えない
e.g. Malli
Clojure / ClojureScript における動的な型チェック
Scheme を定義した関数の入出力値をチェックしたり、Form の バリデーション も可能
フォーマッタ と連携することも
代替ツールは軒並み TypeScript 製に置き換わっている
prop-types(遥か昔に React で利用されていたライブラリ)はあるが、メンテナンスされてなさそう
回避策
Zod や Valibot のようなバリデーションライブラリを関数の入力値の動的な型チェックに用いる
pre / post で 事前条件 / 事後条件 を設定する(契約による設計)のでこれを利用
NODE_ENV=development の時だけチェックする
Github.icon サンプルコード
FE: https://github.com/neumann-tokyo/vite-squint-react-template
BE: https://github.com/neumann-tokyo/vite-squint-hono-template
#関数型まつり_2025